package com.recipedb.sprint.util;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.recipedb.sprint.entity.AdminPrompt;
import com.recipedb.sprint.repository.AdminPromptRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Slf4j
@Component
public class PromptBuilder {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Autowired
    private AdminPromptRepository adminPromptRepository;

    // 现有的 system prompt
    private final String systemPrompt = "**请按以下结构生成推荐报告：**\n" +
            "\n" +
            "1. **核心推荐摘要**\n" +
            "   - 制作对比表格，包含3-4款推荐车型，要有推荐车型的明确字段标识\n" +
            "   - 每款车标注：核心定位、官网、落地价预估、一句话推荐、推荐指数\n" +
            "\n" +
            "2. **关键参数对比表**\n" +
            "   - 包含：能源类型、官方价格、驱动形式、续航/油耗、优势亮点、主要短板\n" +
            "\n" +
            "3. **分点详述**（使用可折叠格式）\n" +
            "   - 每款车单独分析：推荐理由、适用场景分析（家庭/旅行/户外）、购买建议\n" +
            "   - 场景评分使用五星评分系统\n" +
            "\n" +
            "4. **最终购买建议**\n" +
            "   - 根据不同使用场景给出针对性推荐排序\n" +
            "   - 提供试驾建议和注意事项\n 以md表格呈现。";

    public String buildPrompt(String userInput, Object preferenceJson) {
        try {
            // 从数据库获取 admin prompt
            String adminPrompt = getAdminPrompt();

            StringBuilder sb = new StringBuilder();

            // 1. 第一段：现有的 systemPrompt
            sb.append(systemPrompt);

            // 2. 第二段：在 systemPrompt 后拼接 adminPrompt
            if (adminPrompt != null && !adminPrompt.trim().isEmpty()) {
                sb.append("\n\n").append(adminPrompt);
            }

            // 3. 用户偏好
            if (preferenceJson != null) {
                String preferenceStr;
                if (preferenceJson instanceof String) {
                    preferenceStr = (String) preferenceJson;
                } else {
                    preferenceStr = objectMapper.writeValueAsString(preferenceJson);
                }
                sb.append("\n\n用户偏好: ").append(preferenceStr);
            }

            // 4. 用户问题
            sb.append("\n\n用户问题: ").append(userInput);

            // 5. 指令
            sb.append("\n请根据以上信息提供专业的汽车选购建议:");

            return sb.toString();
        } catch (Exception e) {
            log.error("Prompt构建失败", e);
            return userInput; // 降级处理
        }
    }

    private String getAdminPrompt() {
        Optional<AdminPrompt> adminPrompt = adminPromptRepository.findById(1L);
        return adminPrompt.map(AdminPrompt::getAdminPrompt)
                .orElse(null); // 如果没有配置就返回null
    }
}